package com.example.hello.controller;

import com.example.hello.common.PageBean;
import com.example.hello.common.Result;
import com.example.hello.entity.Emp;
import com.example.hello.service.EmpService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;

/**
 * 员工Controller层
 */
@RestController
@RequestMapping("/emps")
public class EmpController {
    
    @Autowired
    private EmpService empService;
    
    @Value("${file.upload.path:/images/avatar/}")
    private String uploadPath;
    
    /**
     * 查询所有员工
     * 请求路径：/emps
     * 请求方式：GET
     */
    @GetMapping
    public Result<List<Emp>> selectAll() {
        try {
            List<Emp> emps = empService.selectAll();
            return Result.success(emps);
        } catch (Exception e) {
            return Result.error("查询失败：" + e.getMessage());
        }
    }
    
    /**
     * 员工信息分页查询
     * 请求路径：/emps
     * 请求方式：GET
     * 请求参数：name, username, gender, start_date, end_date, page, pageSize
     */
    @GetMapping(params = {"page", "pageSize"})
    public Result<PageBean<Emp>> selectByPage(
            @RequestParam(required = false) String name,
            @RequestParam(required = false) String username,
            @RequestParam(required = false) Integer gender,
            @RequestParam(required = false) String start_date,
            @RequestParam(required = false) String end_date,
            @RequestParam(defaultValue = "1") Integer page,
            @RequestParam(defaultValue = "10") Integer pageSize) {
        try {
            LocalDate startDate = null;
            LocalDate endDate = null;
            
            if (start_date != null && !start_date.isEmpty()) {
                startDate = LocalDate.parse(start_date);
            }
            if (end_date != null && !end_date.isEmpty()) {
                endDate = LocalDate.parse(end_date);
            }
            
            PageBean<Emp> pageBean = empService.selectByPage(name, username, gender, startDate, endDate, page, pageSize);
            return Result.success(pageBean);
        } catch (Exception e) {
            return Result.error("分页查询失败：" + e.getMessage());
        }
    }
    
    /**
     * 根据ID查询员工
     * 请求路径：/emps/{id}
     * 请求方式：GET
     */
    @GetMapping("/{id}")
    public Result<Emp> selectById(@PathVariable Integer id) {
        try {
            Emp emp = empService.selectById(id);
            if (emp == null) {
                return Result.error("员工不存在");
            }
            return Result.success(emp);
        } catch (Exception e) {
            return Result.error("查询失败：" + e.getMessage());
        }
    }
    
    /**
     * 添加员工
     * 请求路径：/emps
     * 请求方式：POST
     */
    @PostMapping
    public Result<Object> insert(@RequestBody Emp emp) {
        try {
            // 参数校验
            if (emp.getUsername() == null || emp.getUsername().trim().isEmpty()) {
                return Result.error("用户名不能为空");
            }
            if (emp.getUsername().length() < 2 || emp.getUsername().length() > 20) {
                return Result.error("用户名长度必须在2-20位之间");
            }
            if (emp.getName() == null || emp.getName().trim().isEmpty()) {
                return Result.error("姓名不能为空");
            }
            if (emp.getName().length() < 2 || emp.getName().length() > 10) {
                return Result.error("姓名长度必须在2-10位之间");
            }
            if (emp.getGender() == null || (emp.getGender() != 1 && emp.getGender() != 2)) {
                return Result.error("性别必须为1（男）或2（女）");
            }
            if (emp.getPhone() == null || emp.getPhone().trim().isEmpty()) {
                return Result.error("手机号不能为空");
            }
            if (emp.getPhone().length() != 11) {
                return Result.error("手机号必须为11位数字");
            }
            if (emp.getHireDate() == null) {
                return Result.error("入职日期不能为空");
            }
            if (emp.getDeptId() == null) {
                return Result.error("部门ID不能为空");
            }
            
            int result = empService.insert(emp);
            if (result > 0) {
                return Result.success();
            } else {
                return Result.error("添加失败");
            }
        } catch (Exception e) {
            return Result.error("添加失败：" + e.getMessage());
        }
    }
    
    /**
     * 修改员工
     * 请求路径：/emps
     * 请求方式：PUT
     */
    @PutMapping
    public Result<Object> update(@RequestBody Emp emp) {
        try {
            // 参数校验
            if (emp.getId() == null) {
                return Result.error("员工ID不能为空");
            }
            if (emp.getUsername() == null || emp.getUsername().trim().isEmpty()) {
                return Result.error("用户名不能为空");
            }
            if (emp.getUsername().length() < 2 || emp.getUsername().length() > 20) {
                return Result.error("用户名长度必须在2-20位之间");
            }
            if (emp.getName() == null || emp.getName().trim().isEmpty()) {
                return Result.error("姓名不能为空");
            }
            if (emp.getName().length() < 2 || emp.getName().length() > 10) {
                return Result.error("姓名长度必须在2-10位之间");
            }
            if (emp.getGender() == null || (emp.getGender() != 1 && emp.getGender() != 2)) {
                return Result.error("性别必须为1（男）或2（女）");
            }
            if (emp.getPhone() == null || emp.getPhone().trim().isEmpty()) {
                return Result.error("手机号不能为空");
            }
            if (emp.getPhone().length() != 11) {
                return Result.error("手机号必须为11位数字");
            }
            if (emp.getHireDate() == null) {
                return Result.error("入职日期不能为空");
            }
            if (emp.getDeptId() == null) {
                return Result.error("部门ID不能为空");
            }
            
            // 检查员工是否存在
            Emp existingEmp = empService.selectById(emp.getId());
            if (existingEmp == null) {
                return Result.error("员工不存在");
            }
            
            int result = empService.update(emp);
            if (result > 0) {
                return Result.success();
            } else {
                return Result.error("修改失败");
            }
        } catch (Exception e) {
            return Result.error("修改失败：" + e.getMessage());
        }
    }
    
    /**
     * 删除员工
     * 请求路径：/emps/{id}
     * 请求方式：DELETE
     */
    @DeleteMapping("/{id}")
    public Result<Object> deleteById(@PathVariable Integer id) {
        try {
            // 检查员工是否存在
            Emp existingEmp = empService.selectById(id);
            if (existingEmp == null) {
                return Result.error("员工不存在");
            }
            
            int result = empService.deleteById(id);
            if (result > 0) {
                return Result.success();
            } else {
                return Result.error("删除失败");
            }
        } catch (Exception e) {
            return Result.error("删除失败：" + e.getMessage());
        }
    }
    
    /**
     * 上传员工头像
     * 请求路径：/emps/avatar
     * 请求方式：POST
     */
    @PostMapping("/avatar")
    public Result<Map<String, String>> uploadAvatar(@RequestParam("file") MultipartFile file,
                                                     @RequestParam("emp_id") Integer empId) {
        try {
            // 检查员工是否存在
            Emp existingEmp = empService.selectById(empId);
            if (existingEmp == null) {
                return Result.error("员工不存在");
            }
            
            // 检查文件是否为空
            if (file.isEmpty()) {
                return Result.error("上传文件不能为空");
            }
            
            // 检查文件类型
            String contentType = file.getContentType();
            if (contentType == null || !contentType.startsWith("image/")) {
                return Result.error("只能上传图片文件");
            }
            
            // 生成唯一文件名
            String originalFilename = file.getOriginalFilename();
            String extension = "";
            if (originalFilename != null && originalFilename.contains(".")) {
                extension = originalFilename.substring(originalFilename.lastIndexOf("."));
            }
            String filename = UUID.randomUUID().toString() + extension;
            
            // 创建上传目录
            File uploadDir = new File(uploadPath);
            if (!uploadDir.exists()) {
                uploadDir.mkdirs();
            }
            
            // 保存文件
            File destFile = new File(uploadDir, filename);
            file.transferTo(destFile);
            
            // 构建访问路径
            String imgUrl = "/images/avatar/" + filename;
            
            // 更新员工头像路径
            empService.updateAvatar(empId, imgUrl);
            
            // 返回结果
            Map<String, String> result = new HashMap<>();
            result.put("img_url", imgUrl);
            return Result.success(result);
            
        } catch (IOException e) {
            return Result.error("文件上传失败：" + e.getMessage());
        } catch (Exception e) {
            return Result.error("上传失败：" + e.getMessage());
        }
    }
}
